import axios from 'axios'
import { getToken, getRefreshToken,setToken,clearToken } from '@/utils/auth'
import appConfig from '@/config/appConfig'
import {refreshToken} from '@/api/userapi'
import { Message } from 'element-ui'

const instance = axios.create({
    baseURL: appConfig.baseUrl,
    timeout: 5000
});


// 添加请求拦截器
instance.interceptors.request.use(function (config) {
    // 在发送请求前，让请求头携带token（本地存在token情况下）
    let token = getToken();
    if (token) {
        config.headers['Authorization'] = 'Bearer ' + token
    }
    return config;
}, function (error) {
    // 对请求发生错误时，将错误返回
    return Promise.reject(error);
});

// 添加响应拦截器
instance.interceptors.response.use(function (response) {
    // 将响应后的数据整理后，再返回给客户端
    return response.data;
}, function (error) {
    // 后端原来返回的是一个401网络错误，无法捕获401错误
    // 检查token。是否过期、被修改。
    if (error.response.status === 401) {
        // 提醒用户当前token已失效
        Message.info('当前登录已经失效，正在为你重新登录，请稍候。。。')
        // 重新获取本地的token、refreshtoken
        let param = {
            token: getToken(),
            refreshToken: getRefreshToken()
        }
        // 如果可以重新刷新获得token，则继续返回原来要进行的请求，否则清空token和refreshToken并返回错误
        refreshToken(param).then(res => {
            setToken(res.data.accessToken, res.data.refreshToken)
            Message({
                type: 'success',
                message: res.msg + ' 请刷新页面或者点击页面中的刷新按钮'
            })
            // 刷新token后，继续执行原来（想要执行的）请求
            return instance.request(error.config);
        }).catch(err => {
            Message({type:'error',message:err.Message})
            clearToken()
        })

    }
    return Promise.reject(error);
});

export default instance